package cn.kow.kmall.controller.item;

import cn.kow.kmall.admin.pojo.vo.ItemListVO;
import cn.kow.kmall.controller.BaseController;
import cn.kow.kmall.core.response.KmallResult;
import cn.kow.kmall.core.util.JsonUtils;
import cn.kow.kmall.core.util.MoneyUtils;
import cn.kow.kmall.pojo.dto.*;
import cn.kow.kmall.pojo.entity.Item;
import cn.kow.kmall.pojo.entity.ItemAttribute;
import cn.kow.kmall.pojo.entity.ItemCategory;
import cn.kow.kmall.pojo.entity.Sku;
import cn.kow.kmall.service.ItemCategoryService;
import cn.kow.kmall.service.ItemService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Author: lijun
 * @Description:
 * @Date: Created in 2019-05-13 15:27
 * @Modified By:
 */
@Slf4j
@RestController
@RequestMapping("/item")
public class ItemController extends BaseController {

    /**
     * 商品服务
     */
    @Autowired
    private ItemService itemService;

    /**
     * 分类服务
     */
    @Autowired
    private ItemCategoryService categoryService;

    /**
     * 新增商品
     * @param itemDTO  商品
     * @return 结果
     */
    @PostMapping(value = "/add")
    public KmallResult add(@Validated @RequestBody ItemEditDTO itemDTO) {
        KmallResult checkResult = checkItemEdit(itemDTO);
        if (KmallResult.isFail(checkResult)) {
            return checkResult;
        }
        itemDTO.setOperator(currentUser().getUsername());
        Item item = itemService.saveItem(itemDTO);
        return KmallResult.success().put("itemId", item.getId());
    }

    KmallResult checkItemEdit(ItemEditDTO itemDTO) {
        long categoryId = itemDTO.getCategoryId();
        ItemCategory itemCategory = categoryService.getById(categoryId);
        if (itemCategory == null) {
            return KmallResult.fail("商品类目不能为空");
        }
        if (StringUtils.isBlank(itemDTO.getPrimaryPic())) {
            return KmallResult.fail("商品主图不能为空");
        }
        if (StringUtils.isBlank(itemDTO.getItemName())) {
            return KmallResult.fail("商品名称不能为空");
        }
        if (StringUtils.isBlank(itemDTO.getSimpleDesc())) {
            return KmallResult.fail("商品简介不能为空");
        }
        if (CollectionUtils.isEmpty(itemDTO.getSwiperPics())) {
            return KmallResult.fail("商品轮播图不能为空");
        }

        List<ItemEditDTO.ItemSpec> itemSpecList = itemDTO.getSpecList();
        if (CollectionUtils.isEmpty(itemDTO.getSpecList())) {
            return KmallResult.fail("商品规格不能为空");
        }
        for (ItemEditDTO.ItemSpec itemSpec : itemSpecList) {
            List<ItemEditDTO.ItemSpecOption> optionDTOList = itemSpec.getOptions();
            if (CollectionUtils.isEmpty(optionDTOList)) {
                return KmallResult.fail("商品规格选项不能为空");
            }
        }
        List<ItemSkuDTO> skuList = itemDTO.getSkuList();
        if (CollectionUtils.isEmpty(skuList)) {
            return KmallResult.fail("商品SKU不能为空");
        }
        for (ItemSkuDTO skuDTO : skuList) {
            if (skuDTO.getSpecOptions().size() < itemSpecList.size()) {
                return KmallResult.fail("请完善SKU规格信息");
            }
        }
        return KmallResult.success();
    }

    @PostMapping("/del")
    public KmallResult remove(@RequestBody Long[] ids) {
        itemService.remove(Arrays.asList(ids));
        return KmallResult.success();
    }

    @PostMapping(value = "/edit")
    public KmallResult edit(@Validated @RequestBody ItemEditDTO itemDTO) {
        KmallResult checkResult = checkItemEdit(itemDTO);
        if (KmallResult.isFail(checkResult)) {
            return checkResult;
        }
        itemDTO.setOperator(currentUser().getUsername());
        Item item = itemService.updateItem(itemDTO);
        return KmallResult.success().put("itemId", item.getId());
    }

    @PostMapping(value = "/online")
    public KmallResult online(@RequestBody Long[] ids) {
        itemService.updateItemOnline(Arrays.asList(ids), currentUser().getUsername());
        return KmallResult.success();
    }

    @PostMapping(value = "/offline")
    public KmallResult offline(@RequestBody Long[] ids) {
        itemService.updateItemOffline(Arrays.asList(ids), currentUser().getUsername());
        return KmallResult.success();
    }

    @PostMapping(value = "/list")
    public KmallResult itemList(@RequestBody ItemQueryDTO queryDTO) {
        Page<Item> page = itemService.listByPage(queryDTO);
        Map<Long, ItemCategory> categoryMap = categoryService.listForMap();
        List<Item> items = page.getContent();
        List<ItemListVO> voList = items.stream().map(
                item -> ItemListVO.builder()
                        .id(item.getId())
                        .categoryId(item.getCategoryId())
                        .category(categoryMap.containsKey(item.getCategoryId()) ? categoryMap.get(item.getCategoryId()).getName() : "")
                        .itemName(item.getName())
                        .simpleDesc(item.getSimpleDesc())
                        .primaryPic(item.getPrimaryPic())
                        .status(item.getStatus())
                        .itemStatus(item.getItemStatus())
                        .createBy(item.getCreateBy())
                        .createTime(item.getCreateTime())
                        .updateBy(item.getUpdateBy())
                        .updateTime(item.getUpdateTime())
                        .remark(item.getRemark())
                        .build()
        ).collect(Collectors.toList());
        return KmallResult.success().put("rows", voList)
                .put("total", page.getTotalElements());
    }

    /**
     * 获取商品详情
     * @param itemId
     * @return
     */
    @GetMapping(value = "/{itemId}")
    public KmallResult itemInfo(@PathVariable Long itemId) {
        // 获取Item
        Item item = itemService.getItemById(itemId);
        List<Sku> itemSkuList = itemService.listSkuByItemId(itemId);
        List<ItemAttribute> itemAttributeList = itemService.listItemAttribute(itemId);
        ItemCategory itemCategory = categoryService.getById(item.getCategoryId());
        ItemCategoryDTO categoryDTO = new ItemCategoryDTO();
        BeanUtils.copyProperties(itemCategory, categoryDTO);

        // 基础信息
        ItemInfoDTO itemInfoDTO = new ItemInfoDTO();
        itemInfoDTO.setItemId(item.getId());
        itemInfoDTO.setItemName(item.getName());
        itemInfoDTO.setCategory(categoryDTO);
        itemInfoDTO.setSimpleDesc(item.getSimpleDesc());
        itemInfoDTO.setPrimaryPic(item.getPrimaryPic());
        itemInfoDTO.setSwiperPics(Arrays.asList(item.getSwiperPic().split(",")));
        itemInfoDTO.setDetail(item.getDetail());
        itemInfoDTO.setItemStatus(item.getItemStatus());
        itemInfoDTO.setStatus(item.getStatus());
        itemInfoDTO.setRemark(item.getRemark());
        itemInfoDTO.setSort(item.getSort());

        // 商品属性
        List<ItemAttributeDTO> attrList = itemAttributeList.stream()
                .map(attr -> ItemAttributeDTO.builder().attrId(attr.getId()).attrName(attr.getName()).attrValue(attr.getValue()).build())
                .collect(Collectors.toList());
        itemInfoDTO.setAttrList(attrList);

        // 商品规格
        String itemSpec = item.getItemSpec();
        List<ItemSpecDTO> specList = JsonUtils.toList(itemSpec, ItemSpecDTO.class);
        itemInfoDTO.setSpecList(specList);

        // sku
        List<ItemSkuDTO> skuList = new ArrayList<>();
        for (Sku sku : itemSkuList) {
            Long skuId = sku.getId();
            Integer sellingPrice = sku.getSellingPrice();

            ItemSkuDTO skuDTO = new ItemSkuDTO();
            skuDTO.setSkuId(skuId);
            skuDTO.setItemId(itemId);
            skuDTO.setSkuName(sku.getItemName());
            skuDTO.setSkuPic(sku.getSkuPic());
            skuDTO.setItemNo(sku.getItemNo());
            skuDTO.setSkuStatus(sku.getSkuStatus());
            skuDTO.setStockNum(sku.getStockNum());
            skuDTO.setSellingPrice(MoneyUtils.Fen2YuanStr(sellingPrice));
            List<ItemSkuDTO.SpecOption> specOptionList = new ArrayList<>();
            if (StringUtils.isNotBlank(sku.getSkuSpecId())) {
                for (String skuSpec : sku.getSkuSpecName().split(";")) {
                    String[] specArray = skuSpec.split(":");
                    ItemSkuDTO.SpecOption specOption = new ItemSkuDTO.SpecOption();
                    specOption.setSpec(specArray[0]);
                    specOption.setOption(specArray[1]);
                    specOptionList.add(specOption);
                }
            }
            skuDTO.setSpecOptions(specOptionList);
            skuList.add(skuDTO);
        }
        itemInfoDTO.setSkuList(skuList);

        return KmallResult.success(itemInfoDTO);
    }
}
